YARN资源调度流程
- 用户向yarn提交一个作业
- RM为该作业分配第一个container(AM)
- RM会与对应的NM通信,要求NM在这个container上启动应用程序的AM
- AM首先向RM注册,然后AM将为各个任务申请资源,并监控运行情况;AM采用轮训的方式通过RPC协议向RM申请和领取资源;AM所需要的资源有多少个core有多个memory到RM进行申请,申请到后返回给AM
- AM申请到资源以后,便和相应的NM通信,要求NM启动任务,任务都是以Container方式运行的。
- NM启动我们作业对应的task;有几个task就启动几个Container
- 任务开始计算进入MapReduce阶段
分步流程图
1、client将程序打包提交到RM运行。
2、RM找一台空闲的机器启动一个Container,为了启动AM(一个Container启动一个AM)。
3、Container进而启动AM,每来一个作业都会启动一个AM
4、AM向RM汇报已到位,开始切分任务启动多少个map和reduce所需要的资源,封装成ResourceRequest对象来提交给RM;RM获取对象后并如果资源不够不会立刻给出所有资源,因为集群是繁忙的,当前可能只有20g的空闲内存,RM会慢慢收集其他作业释放的资源,直到100G。(如何解决这个等待策略,可以通过优先级来解决)
5、当RM把资源分配个AM的时候,当前的AM就可以启动当前任务;联系有空闲资源的nodemanager来完成任务;把请求封装到COntainerLaunchContext对象里传递给NodeManager。
6、NodeManager接受到请求之后就会把Container启动起来。
7、运行当前的Task
8、因为有若干个map,所以ApplicationMaster向空闲的NodeManager会继续申请资源。
9、task里运行的map还是reduce都是由AM来指挥的。
10、每个task会以心跳机制来向ApplicationMaster来汇报作业当前的运行情况。有特别情况会进行重启,或者进行全部作业重启,这些都是ApplicationMaster来管理的。
Yarn各个组件之间的心跳信号
- Application Master与Resource Manager心跳
- AM->RM
- 对Container的资源需求(CPU和Memory)和优先级
- 已用完等待回收的Container列表
- RM->AM
- 新申请到的Container
- 已完成Container的状态
- AM->RM
- Application Master与Node Manager心跳
- AM -> NM
- 发起启动Container请求
- NM -> AM
- 汇报Container状态
- AM -> NM
- Node Manager与Resource Manager心跳
- NM->RM
- Node Manager上所有的Container状态
- RM->NM
- 已删除和等待清理的Container列表
- NM->RM
Yarn资源隔离策略
- 内存资源隔离
- 基于线程监控方案(优点:如果瞬间超过设定上限不会立马被kill掉)
- 基于cgroups(linux里的资源轻量级方案,如果超过上限会立马被kill掉)
- CPU资源隔离
- 默认不对CPU资源进行隔离
- 基于cgroups
Yarn容错处理
- 失败类型
- 程序失败 进程奔溃 硬件问题
- 如果作业失败了
- 作业异常均会汇报给Application Master
- 通过心跳信号检查挂住的任务
- 一个作业的任务失败比例超过配置,就会认为该任务失败
- 如果Application Master失败了
- Resource Manager接收不到心跳信号时会重启Application Master
- 如果Node Manager失败了
- Resource Manager接收不到心跳信号时会将其移出
- Resource Manager通知Application Master,让Application Master决定任务如何处理
- 如果某个Node Manager失败任务次数过多,Resource Manager调度任务时不再其上面运行任务
- 如果Resource Manager运行失败
- 通过checkpoint机制,定时将其状态保存到磁盘,失败的时候,重新运行
- 通过Zookeeper同步状态和实现透明的HA